package com.baizhi.aop;


import com.baizhi.annotation.LogAnnotion;
import com.baizhi.dao.BzLogMapper;
import com.baizhi.entity.BzAdmin;
import com.baizhi.entity.BzLog;
import com.baizhi.util.IPKit;
import com.baomidou.mybatisplus.extension.handlers.GsonTypeHandler;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Date;


@Aspect
@Configuration
public class LogAop1 {


    @Resource
    private BzLogMapper  bzLogMapper;

    @Autowired
    private HttpServletRequest  request;


    @After("@annotation( com.baizhi.annotation.LogAnnotion)")
    public void logAfter(JoinPoint joinPoint) {
        /**
         *
         * 1.获取日志信息
         */

        BzLog bzLog = new BzLog();
//        日期
        bzLog.setLogDate(new Date());
//      ip  通过工具类
        String ipAddrByRequest = IPKit.getIpAddrByRequest(this.request);
        System.out.println(ipAddrByRequest);
        bzLog.setLogIp(ipAddrByRequest);
//      session   用户名
        BzAdmin admin = (BzAdmin) request.getSession ().getAttribute("admin");

        if (admin!=null){
            bzLog.setUsername(admin.getUsername());
        }else {
            bzLog.setUsername("hhh");
        }

//        操作类型和内容
        /**
         * 调用的方法不同  所获取的类型和内容不同
         *
         * 自定义  注解(定义  类型和内容不同)
         *
         *
         * 通过切面获取自定义注解中的数据
         *
         *
         * 获取目标方法上的注解  连接点对象
         *
         */

//        1.获取方法签名对象
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//          2.通过方法签名对象获取切面对象
        Method method = signature.getMethod();
//        3.通过方法对象获取方法上的注解
        LogAnnotion annotation = method.getAnnotation(LogAnnotion.class);

//        String type = annotation.type();
//        bzLog.setLogType(type);
        bzLog.setLogContent(annotation.content());

        System.out.println(bzLog);


        /**
         * 2.添加日志数据
         */
        bzLogMapper.insert(bzLog);





    }
}
